# 腾讯云COS服务模块
# 用于项目中创建和管理COS存储桶

import os
import logging
from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client
from qcloud_cos import CosServiceError

# 配置日志
logger = logging.getLogger(__name__)

# 腾讯云COS配置
# 注意：实际使用时，应从配置文件或环境变量中加载这些参数
# 不要将密钥硬编码在代码中
SECRET_ID = os.environ.get('TENCENT_COS_SECRET_ID', '')
SECRET_KEY = os.environ.get('TENCENT_COS_SECRET_KEY', '')
REGION = 'ap-guangzhou'  # 默认区域


class CosClient:
    """腾讯云COS客户端类"""
    def __init__(self, region=REGION):
        """
        初始化COS客户端
        :param region: COS区域
        """
        self.region = region
        self.config = CosConfig(
            Region=self.region,
            SecretId=SECRET_ID,
            SecretKey=SECRET_KEY
        )
        self.client = CosS3Client(self.config)

    def create_bucket(self, bucket_name):
        """
        创建COS存储桶
        :param bucket_name: 存储桶名称
        :return: 是否创建成功
        """
        try:
            # 检查存储桶是否已存在
            self.client.head_bucket(Bucket=bucket_name)
            logger.info(f'存储桶 {bucket_name} 已存在')
            return True
        except CosServiceError as e:
            if e.get_status_code() == 404:
                # 存储桶不存在，创建存储桶
                try:
                    self.client.create_bucket(
                        Bucket=bucket_name,
                        ACL='public-read',  # 公共读权限
                        CreateBucketConfiguration={
                            'LocationConstraint': self.region
                        }
                    )
                    logger.info(f'存储桶 {bucket_name} 创建成功')
                    return True
                except Exception as ex:
                    logger.error(f'创建存储桶 {bucket_name} 失败: {str(ex)}')
                    return False
            else:
                logger.error(f'检查存储桶 {bucket_name} 状态失败: {str(e)}')
                return False

    def delete_bucket(self, bucket_name):
        """
        删除COS存储桶
        :param bucket_name: 存储桶名称
        :return: 是否删除成功
        """
        try:
            # 先清空存储桶（腾讯云要求删除前必须清空）
            # 这里简化处理，实际应用中可能需要分页列出并删除所有对象
            self.client.delete_bucket(Bucket=bucket_name)
            logger.info(f'存储桶 {bucket_name} 删除成功')
            return True
        except Exception as e:
            logger.error(f'删除存储桶 {bucket_name} 失败: {str(e)}')
            return False


def create_cos_bucket(bucket_name, region=REGION):
    """
    创建COS存储桶的便捷函数
    :param bucket_name: 存储桶名称
    :param region: COS区域
    :return: 是否创建成功
    """
    cos_client = CosClient(region)
    return cos_client.create_bucket(bucket_name)


def delete_cos_bucket(bucket_name, region=REGION):
    """
    删除COS存储桶的便捷函数
    :param bucket_name: 存储桶名称
    :param region: COS区域
    :return: 是否删除成功
    """
    cos_client = CosClient(region)
    return cos_client.delete_bucket(bucket_name)


# 示例用法
if __name__ == '__main__':
    # 测试创建存储桶
    bucket = 'test-bucket-12345'
    result = create_cos_bucket(bucket)
    print(f'创建存储桶 {bucket} {"成功" if result else "失败"}')